import os


class PathTool:
    def __init__(self):
        self.__root_path = self.__get_root_path()
        self.__root_all_dir_json = self.get_dir_json(self.__root_path)
        self.__ui_all_files_json = self.get_files_json(self.__root_all_dir_json["ui"])

    def __join(self, root, path):
        """将文件或文件夹和指定目录拼接，并返回组合后的绝对路径。

        Args:
            root (str): 需要拼接的目录。
            path (str): 文件或文件夹。

        Returns:
            str: 组合后的绝对路径。
        """
        return os.path.join(root, path).replace('\\', '/')

    def __get_root_path(self):
        """获取项目根目录。

        Returns:
            str: 返回项目根目录。
        """
        script_dir = os.path.dirname(os.path.abspath(__file__))[
                     :-5].replace('\\', '/')
        # print(f"根目录：{script_dir}")
        return script_dir

    def __add_path(self, path):
        """将路径和根目录组合起来，并返回组合后的路径。

        Args:
            path (str): 目录或文件名。

        Returns:
            str: 和根目录组合后的路径。
        """
        # 如果是相对路径，则将其与根路径组合
        if not os.path.isabs(path):
            path = self.__join(self.__root_path, path)
        # 检查路径是否存在
        if os.path.exists(path):
            # print(f"路径 {path} 添加成功")
            return path
        else:
            # print(f"路径 {path} 不存在")
            return ""

    def get_files_list(self, path):
        """获取指定文件夹中所有文件的路径

        Args:
            path (str): 目录名

        Returns:
            list: 返回文件路径列表
        """
        if os.path.isfile(path):
            path = os.path.dirname(path)
        files_list = []
        # 获取目录中所有文件和文件夹的名称
        for filename in os.listdir(path):
            # 使用 join 函数将目录路径和文件名拼接起来，形成完整路径
            file_path = self.__join(path, filename)
            # 检查是否为文件，并打添加到列表中
            if os.path.isfile(file_path):
                files_list.add(file_path)
        return files_list

    def get_dir_list(self, path):
        """获取指定文件夹或文件所在文件夹中所有文件夹的路径

        Args:
            path (str): 目录名或文件名

        Returns:
            list: 返回文件夹绝对路径列表
        """
        if os.path.isfile(path):
            path = os.path.dirname(path)
        dir_list = []
        # 获取目录中所有文件和文件夹的名称
        for filename in os.listdir(path):
            # 使用 join 函数将目录路径和文件名拼接起来，形成完整路径
            dir_path = self.__join(path, filename)
            # 检查是否为文件，并打添加到列表中
            if not os.path.isfile(dir_path):
                dir_list.add(dir_path)
        return dir_list

    def get_files_json(self, path):
        """获取指定文件夹中所有文件的路径，并返回字典，key：文件名，value：文件路径

        Args:
            path (str): 指定文件夹路径

        Returns:
            dic: 文件夹中所有文件的路径字典
        """
        if os.path.isfile(path):
            path = os.path.dirname(path)
        files_dic = {}
        for filename in os.listdir(path):
            # 使用 join 函数将目录路径和文件名拼接起来，形成完整路径
            file_path = self.__join(path, filename)
            # 检查是否为文件，并打添加到列表中
            if os.path.isfile(file_path):
                files_dic.setdefault(os.path.splitext(filename)[0], file_path)
        return files_dic

    def get_dir_json(self, path):
        """获取指定文件夹或文件所在文件夹中所有文件夹的路径字典，key：文件夹名，value：文件夹绝对路径

        Args:
            path (str): 目录名或文件名

        Returns:
            list: 返回文件夹绝对路径字典
        """
        if os.path.isfile(path):
            path = os.path.dirname(path)
        dir_dic = {}
        # 获取目录中所有文件和文件夹的名称
        for filename in os.listdir(path):
            # 使用 join 函数将目录路径和文件名拼接起来，形成完整路径
            dir_path = self.__join(path, filename)
            # 检查是否为文件，并打添加到列表中
            if not os.path.isfile(dir_path):
                dir_dic.setdefault(os.path.splitext(filename)[0], dir_path)
        return dir_dic

    def get_ui_path(self, filename):
        """通过文件名（不带后缀），获取ui文件夹中指定文件的绝对路径

        Args:
            filename (str): 不带后缀的文件名

        Returns:
            str: 文件的绝对路径，如果没有该文件，则返回空字符串
        """
        if filename in self.__ui_all_files_json:
            temp = self.__ui_all_files_json[filename]
            return self.__add_path(temp)
        else:
            return ""




if __name__ == "__main__":
    path_tool = PathTool()
    data = path_tool.get_ui_path("extra")
    print(data)
